const basicAuth = require('basic-auth')
const jwt = require('jsonwebtoken')
const { security } = require('../config/config')
const { Forbbiden } = require('../core/http-exception')
// 令牌 权限验证
class Auth {
    constructor(level) {
        // level 用户权限
        this.level = level || 1; // 1为最小权限
        Auth.USER = 8 // 普通用户
        Auth.ADMIN = 16 // 管理员2
        Auth.SUPER_ADMIN = 32 // 管理员1


    }
    get m() {
        return async (ctx, next) => {
            const userToken = basicAuth(ctx.req)

            // 如果 token 不存在
            if (!userToken || !userToken.name) {
                throw new Forbbiden('未授权，禁止访问')
            }

            // 验证用户 token 是否合法
            try {
                var decode = jwt.verify(userToken.name, security.secretKey)
            } catch (e) {
                // 1 token 不合法
                if (e.name == 'TokenExpiredError') {
                    throw new Forbbiden('token 已过期')
                } else {
                    throw new Forbbiden('token 不合法 ')
                }

                // 2 token 过期
            }

            if (decode.scope < this.level || !decode.scope) {
                throw new Forbbiden('权限不足')
            }
            ctx.auth = {
                uid: decode.uid,
                scope: decode.scope
            }

            await next()
        }
    }

    // 验证令牌是否过期
    static verifyToken(token) {
        try {
            jwt.verify(token, security.secretKey)
            return true
        } catch (e) {
            return false
        }
    }
}

module.exports = {
    Auth
}